{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 52,
   "source": [
    "import numpy as np\r\n",
    "import pandas as pd\r\n",
    "import matplotlib.pyplot as plt\r\n"
   ],
   "outputs": [],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "source": [
    "iris = pd.read_table('iris.txt',header=None,sep=',')\r\n",
    "iris.head()"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "     0    1    2    3            4\n",
       "0  5.1  3.5  1.4  0.2  Iris-setosa\n",
       "1  4.9  3.0  1.4  0.2  Iris-setosa\n",
       "2  4.7  3.2  1.3  0.2  Iris-setosa\n",
       "3  4.6  3.1  1.5  0.2  Iris-setosa\n",
       "4  5.0  3.6  1.4  0.2  Iris-setosa"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4.9</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4.7</td>\n",
       "      <td>3.2</td>\n",
       "      <td>1.3</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.6</td>\n",
       "      <td>3.1</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.6</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "metadata": {},
     "execution_count": 53
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "source": [
    "#函数功能：欧式距离计算公式\r\n",
    "def distEclud(vecA,vecB):\r\n",
    "    return np.sum(np.power(vecA - vecB,2),axis=1)"
   ],
   "outputs": [],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "source": [
    "def randCent(df,k):\r\n",
    "    n = df.shape[1]\r\n",
    "    #特征值列\r\n",
    "    data_min = df.iloc[:,:n-1].min()\r\n",
    "    data_max = df.iloc[:,:n-1].max()\r\n",
    "    #随机制定K个质心\r\n",
    "    return np.random.uniform(data_min,data_max,(k,n-1))"
   ],
   "outputs": [],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "source": [
    "randCent(iris,3)"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "array([[7.74184126, 3.49341263, 6.20835859, 1.54622303],\n",
       "       [7.0274592 , 3.7412367 , 6.38317944, 1.59868374],\n",
       "       [7.70597612, 3.06760001, 4.21146538, 2.10030336]])"
      ]
     },
     "metadata": {},
     "execution_count": 56
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "source": [
    "#函数功能：K均值聚类\r\n",
    "#输入：df\r\n",
    "#k:聚类集的个数\r\n",
    "#distMet:距离计算公式\r\n",
    "#creatCent:质心初始化函数\r\n",
    "def kmeans(df,k,distMet=distEclud,creatCent=randCent):\r\n",
    "    m,n = df.shape\r\n",
    "    #初始化质心\r\n",
    "    centroids = creatCent(df,k)\r\n",
    "    #序列数据存储\r\n",
    "    clusterAssment = np.zeros((m,3))\r\n",
    "    clusterAssment[:,0] = np.inf\r\n",
    "    clusterAssment [:,1:3] = -1\r\n",
    "    #数据拼接\r\n",
    "    result_set = pd.concat([df,pd.DataFrame(clusterAssment)],axis=1,ignore_index=True)\r\n",
    "    #标志位\r\n",
    "    clusterChanged = True\r\n",
    "    while clusterChanged:\r\n",
    "        clusterChanged = False\r\n",
    "        for i in range(m):\r\n",
    "            dist = distMet(df.iloc[i,:n-1].values,centroids)\r\n",
    "            #当前距离的最小值\r\n",
    "            result_set.iloc[i,-3] = dist.min()\r\n",
    "            #当前聚类结果索引\r\n",
    "            result_set.iloc[i,-2] = np.where(dist == dist.min())[0]\r\n",
    "            #所有点的分类全部不变，才能代表质心没有改变\r\n",
    "        clusterChanged = not(result_set.iloc[:,-1] == result_set.iloc[:,-2]).all()\r\n",
    "        if clusterChanged:\r\n",
    "            #更新质心\r\n",
    "            cent_df = result_set.groupby(n+1).mean()\r\n",
    "            centroids = cent_df.iloc[:,:n-1].values\r\n",
    "            result_set.iloc[:,-1] = result_set.iloc[:,-2]\r\n",
    "\r\n",
    "    return centroids,result_set"
   ],
   "outputs": [],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "source": [
    "testSet = pd.read_table('testSet1.txt',header=None)\r\n",
    "label = pd.DataFrame(np.zeros(testSet.shape[0]))"
   ],
   "outputs": [],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "source": [
    "test_set = pd.concat([testSet,label],axis=1,ignore_index=True)"
   ],
   "outputs": [],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "source": [
    "test_cent,test_cluster = kmeans(test_set,4)"
   ],
   "outputs": [],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "source": [
    "#绘制原始数据集\r\n",
    "plt.scatter(test_cluster.iloc[:,0],test_cluster.iloc[:,1],c=test_cluster.iloc[:,-1])\r\n",
    "#绘制质心\r\n",
    "plt.scatter(test_cent[:,0],test_cent[:,1],color='red',marker='x',s=100)"
   ],
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0xec7e9e8>"
      ]
     },
     "metadata": {},
     "execution_count": 61
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {
      "needs_background": "light"
     }
    }
   ],
   "metadata": {}
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "8bfad08b73d8ae58273d7e252c9e1d922058e2a21d3a8ccb2a1b9808ae54a57f"
  },
  "kernelspec": {
   "display_name": "Python 3.8.0 32-bit",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.0"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}